package Datos;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class SQLs {
    private String Consulta;
    private String NoConsulta;
    conexion MiConexion;
    
    public SQLs(){
    }

    public Object[][] ComandoConQuery(String pConsulta){
       try {
        Object Obj [][] = null;
        MiConexion = new conexion();
        CallableStatement prcProcedimientoAlmacenado;
        prcProcedimientoAlmacenado = MiConexion.ObtenerConexion().prepareCall(pConsulta);
        ResultSet Rs = prcProcedimientoAlmacenado.executeQuery();
        Obj = ResultSetToArray(Rs);
        Rs.close();
        prcProcedimientoAlmacenado.close();
        MiConexion.LiberarConexion();
        return Obj;
       }
       catch(SQLException e){
             MiConexion.LiberarConexion();
             throw new IllegalArgumentException(e.getMessage());
      }
    }
    
    public void ComandoSinQuery(String pConsulta){
       this.NoConsulta=pConsulta;
       try {
        MiConexion = new conexion();
        CallableStatement prcProcedimientoAlmacenado;
        prcProcedimientoAlmacenado = MiConexion.ObtenerConexion().prepareCall(this.NoConsulta);
	prcProcedimientoAlmacenado.executeUpdate();
        prcProcedimientoAlmacenado.close();
        MiConexion.LiberarConexion();
       }
       catch(SQLException e){
             MiConexion.LiberarConexion();
             throw new IllegalArgumentException(e.getMessage());
      }
    }
    
    public int CuentaFilas(String pConsulta){
      this.Consulta=pConsulta;
      int NumeroRegistros = 0;
      try{         
         MiConexion = new conexion();
         ResultSet res;
         res = MiConexion.ObtenerConexion().prepareStatement(this.Consulta).executeQuery();
         res.next();
         NumeroRegistros = res.getInt("Total");
         res.close();
         MiConexion.LiberarConexion();
      }
      catch(SQLException e){
         MiConexion.LiberarConexion();
         throw new IllegalArgumentException(e.getMessage());
      }
      return NumeroRegistros;
     }
    
    

      public float ValorFloat(String pConsulta){
      this.Consulta=pConsulta;
      float Valor = 0;
      try{         
         MiConexion = new conexion();
         ResultSet res;
         res = MiConexion.ObtenerConexion().prepareStatement(this.Consulta).executeQuery();
         res.next();
         Valor = res.getInt("Total");
         res.close();
         MiConexion.LiberarConexion();
      }
      catch(SQLException e){
         MiConexion.LiberarConexion();
         throw new IllegalArgumentException(e.getMessage());
      }
      return Valor;
     }

      public int ValorInt(String pConsulta){
      this.Consulta=pConsulta;
      int Valor = 0;
      try{         
         MiConexion = new conexion();
         ResultSet res;
         res = MiConexion.ObtenerConexion().prepareStatement(this.Consulta).executeQuery();
         res.next();
         Valor = res.getInt("ID");
         res.close();
         MiConexion.LiberarConexion();
      }
      catch(SQLException e){
         MiConexion.LiberarConexion();
         throw new IllegalArgumentException(e.getMessage());
      }
      return Valor;
     }      
      
    public boolean SeElimina(String TablaOrigen, String TablaDestino, int pID, int Tipo){
      
      if (Tipo==1) {
           this.NoConsulta = "Select Count(" + TablaOrigen.trim() + ".ID) as Total FROM " + TablaOrigen.trim() + " inner join " + TablaDestino.trim()+ " on " + TablaOrigen.trim() + ".ID = " + TablaDestino.trim()+"."+TablaOrigen.trim() + "ID where " + TablaOrigen.trim() +".ID = " +pID + " and "+ TablaOrigen.trim() +".Estado = 1" + " and "+ TablaDestino.trim() +".Estado = 1";
      }
      
      if (Tipo==2) {
           this.NoConsulta  = "Select Count(" + TablaOrigen.trim() + ".ID) as Total FROM " + TablaOrigen.trim() + " inner join " + TablaDestino.trim()+ " on " + TablaOrigen.trim() + ".ID = " + TablaDestino.trim()+".CreadoPor where " + TablaOrigen.trim() +".ID = " +pID+ " and "+ TablaOrigen.trim() +".Estado = 1"  + " and "+ TablaDestino.trim() +".Estado = 1";
      }
      
      if (Tipo==3) {
           this.NoConsulta  = "Select Count(" + TablaOrigen.trim() + ".ID) as Total FROM " + TablaOrigen.trim() + " inner join " + TablaDestino.trim()+ " on " + TablaOrigen.trim() + ".ID = " + TablaDestino.trim()+".ModificadoPor where " + TablaOrigen.trim() +".ID = " +pID+ " and "+ TablaOrigen.trim() +".Estado = 1"  + " and "+ TablaDestino.trim() +".Estado = 1";
      }
      
      int NumeroRegistros = CuentaFilas(this.NoConsulta);
      
      if (NumeroRegistros==0) {
              return true;
          }
         else {
              return false;
          }
    }  
    
    //Convierte el ResulSet Devuelto por una Consulta SQL en una matriz Object
    private Object[][] ResultSetToArray(ResultSet rs)
    {
        Object obj[][]=null;
 
        try
        {
 
        rs.last();
 
        ResultSetMetaData rsmd = rs.getMetaData();
 
        int numCols = rsmd.getColumnCount();
 
        int numFils =rs.getRow();

        obj=new Object[numFils][numCols];
        int j = 0;
 
        rs.beforeFirst();
 
        while (rs.next())
        {
            for (int i=0;i<numCols;i++)
            {
                obj[j][i]=String.valueOf(rs.getObject(i+1));
            }
            j++;
 
        }
 
        }
        catch(Exception e)
        {
             System.out.println(e.getStackTrace());
             System.out.println(e.getMessage());
        }
 
        return obj;
    }
 
    
}
